import java.util.HashMap;
import java.util.Map;

/**
 * @author lcl
 * @DateTime 2024/10/30 0:25
 */
public class Main {

    private static Store store = new Store();

    static {
        Apple apple = new Apple(8);
        Strawberry strawberry = new Strawberry(13);
        Mango mango = new Mango(20);
        store.setApple(apple);
        store.setMango(mango);
        store.setStrawberry(strawberry);
    }

    public static void main(String[] args) {
        // A购买了3斤苹果和4斤草莓，3*8 + 13 * 4 = 76
        double paid = pay1(3, 4);
        assert paid == 3*8 + 13 * 4;
        System.out.println("A购买了3斤苹果和4斤草莓, 应付：" + paid);
        // B购买了3斤苹果和4斤草莓和5斤芒果，3*8 + 13 * 4 + 20 * 5 = 176
        paid = pay2(3, 4, 5);
        assert paid == 3*8 + 13 * 4 + 20 * 5;
        System.out.println("B购买了3斤苹果和4斤草莓和5斤芒果, 应付：" + paid);
        // C购买了3斤苹果和4斤草莓和5斤芒果，3*8 + 13 * 4 * 0.8 + 20 * 5= 165.6
        paid = pay3(3,4,5);
        assert paid == 3*8 + 13 * 4 * 0.8 + 20 * 5;
        System.out.println("C购买了3斤苹果和4斤草莓和5斤芒果, 应付：" + paid);
        // D购买了3斤苹果和4斤草莓和5斤芒果，3*8 + 13 * 4 * 0.8 + 20 * 5= 165.6，满减165.6 - 10 = 155.6
        paid = pay4(3,4,5);
        assert paid == (8 * 3 + 13 * 4 * 0.8 + 20 * 5 - 10);
        System.out.println("D购买了3斤苹果和4斤草莓和5斤芒果, 应付：" + paid);
    }

    /**
     * 1、有一家超市，出售苹果和草莓。其中苹果 8 元/斤，草莓 13 元/斤。
     * 现在顾客 A 在超市购买了若干斤苹果和草莓，需要计算一共多少钱？
     * 请编写函数，对于 A 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。
     **/
    public static double pay1(int appleAmount, int strawberryAmount) {
        assert appleAmount > 0 && strawberryAmount > 0;
        // 创建购物车
        Map<Fruit, Integer> cart = new HashMap<>();
        cart.put(store.getApple(), appleAmount);
        cart.put(store.getStrawberry(), strawberryAmount);
        // 计算需要支付的金额
        double paid = store.pay(cart);
        return paid;
    }

    /**
     * 2、超市增加了一种水果芒果，其定价为 20 元/斤。
     * 现在顾客 B 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
     * 请编写函数，对于 B 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。
     **/
    public static double pay2(int appleAmount, int strawberryAmount, int mangoAmount) {
        assert appleAmount > 0 && strawberryAmount > 0 && mangoAmount > 0;
        // 创建购物车
        Map<Fruit, Integer> cart = new HashMap<>();
        cart.put(store.getApple(), appleAmount);
        cart.put(store.getStrawberry(), strawberryAmount);
        cart.put(store.getMango(), mangoAmount);
        // 计算需要支付的金额
        double paid = store.pay(cart);
        return paid;
    }

    /**
     * 3、超市做促销活动，草莓限时打 8 折。
     * 现在顾客 C 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
     * 请编写函数，对于 C 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。
     **/
    public static double pay3(int appleAmount, int strawberryAmount, int mangoAmount) {
        assert appleAmount > 0 && strawberryAmount > 0 && mangoAmount > 0;
        // 创建购物车
        Map<Fruit, Integer> cart = new HashMap<>();
        cart.put(store.getApple(), appleAmount);
        Strawberry strawberry = store.getStrawberry();
        strawberry.setDiscount(0.8);
        cart.put(strawberry, strawberryAmount);
        cart.put(store.getMango(), mangoAmount);
        // 计算需要支付的金额
        double paid = store.pay(cart);
        return paid;
    }

    /**
     * 4、促销活动效果明显，超市继续加大促销力度，购物满 100 减 10 块。
     * 现在顾客 D 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
     * 请编写函数，对于 D 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。
     */
    public static double pay4(int appleAmount, int strawberryAmount, int mangoAmount) {
        assert appleAmount > 0 && strawberryAmount > 0 && mangoAmount > 0;
        // 创建购物车
        Map<Fruit, Integer> cart = new HashMap<>();
        cart.put(store.getApple(), appleAmount);
        Strawberry strawberry = store.getStrawberry();
        strawberry.setDiscount(0.8);
        cart.put(strawberry, strawberryAmount);
        cart.put(store.getMango(), mangoAmount);
        // 计算需要支付的金额
        double paid = store.pay(cart);
        // 计算满减
        if (paid > 10) {
            paid -= 10;
        }
        return paid;
    }

}